/**
 * Copyright (C), 2001-2031, www.bosssof.com.cn
 * FileName: UserService.java
 * Author: WangXin
 * Date: 2024/6/1 下午6:30
 * Description:
 * <p>
 * History:
 * Date          Author   Version  Desc
 * 2024-01-01    bosssoft  1.0.0   initialize this file
 */
package com.bosssoft.g1.service;

import com.bosssoft.g1.common.data.dto.IdVersion;
import com.bosssoft.g1.dto.DepartmentDTO;
import com.bosssoft.g1.dto.PageDTO;
import com.bosssoft.g1.dto.UserDTO;
import com.bosssoft.g1.entity.User;
import com.bosssoft.g1.query.UserAuthQuery;
import com.bosssoft.g1.query.UserLoginQuery;
import com.bosssoft.g1.query.UserQuery;
import com.bosssoft.g1.vo.IdNameVO;
import com.bosssoft.g1.vo.RoleVO;
import com.bosssoft.g1.vo.UserAuthVO;
import com.github.pagehelper.PageInfo;
import org.springframework.transaction.annotation.Transactional;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Map;


/**
 * @className: UserService
 * @description:
 * 解决什么问题：
 *  演示线程池的正确使用 
 * 主要方法和数据成员：
 *  methodxx 使用 ThreadPoolExecutor创建线程进行任务操作
 * 注意事项：
 *  例如：该类需要从容器获取不可以new   
 * @author: WangXin
 * @date: 2024/6/1下午6:30
 * @since 1.0
 **/
public interface UserService {
    /**
     * 用户认证方法
     *
     * @param userAuthQuery 包含用户认证信息的DTO
     * @return 认证成功返回User对象，失败返回null
     */
    UserAuthVO authenticate(UserLoginQuery userAuthQuery);
    /**
     *  界面调用接口增加用户
     *  业务异常规则  身份证号不可重复
     * @param userDTO 用户信息
     * @return true成功 false失败
     */
    Boolean add(@NotNull @Valid UserDTO userDTO);

    /**
     *  删除用户
     * @param id  用户id
     * @return  true 成功 false失败
     */
    Boolean remove(@NotNull @Valid Long id);

    /**
     *  批量删除用户
     * @param userDTO
     * @return true成功 false失败
     */
    //@Transactional
    Boolean batchRemove(@NotEmpty List<UserDTO> userDTO);


    /**
     *  通过id查询
     * @param id
     * @return true成功 false失败
     */
    UserDTO queryUserById( Long id);

    /**
     *  获取所有用户信息
     * @param pageDTO 分页信息
     * @return  用户列表
     */
    PageInfo<UserDTO> getAllUsers(PageDTO pageDTO);

    PageInfo<UserDTO> searchUser(UserQuery userQuery);

    List<IdNameVO> getAllDepartments();

    List<IdNameVO> getAllRoles();

    List<IdNameVO> getAllPositions();

    Boolean updateUser(UserDTO userDTO);

    /**
     *  分页查询
     * @param username
     * @param password
     * @return true成功 false失败
     */
    Boolean tokenQuery(String username, String password);

    /**
     * 通过Id 和 version 查找用户
     * @author YuXingZh
     * @date 2024/06/06 11:08
     *
     * @param ids
     * @return int
     */
    List<User> getUserByIds(List<Long> ids);


    /**
     * 通过Id 和 version 查找用户
     * @author YuXingZh
     * @date 2024/06/06 11:08
     *
     * @param id
     * @return int
     */
    User getUserById(Long id);

    /**
     * 更改用户状态
     * @author YuXingZh
     * @date 2024/06/06 11:26
     *
     * @param ids
     * @return void
     */
    void changeStatus(List<Long> ids, int status);

    /**
     * 为用户分配角色
     * @author YuXingZh
     * @date 2024/06/08 16:02
     *
     * @param userIds
     * @param roleIds
     * @return void
     */
    boolean userAssign(List<Long> userIds, List<Long> roleIds);

    /**
     * 生成用户的角色职位部门树
     * @param id
     * @return
     */
    Map<String,List> getUserRolePositionDepartmentTree(@NotNull Long id);

    /**
     * 根据部门id查询用户信息
     * @param pageNum
     * @param pageSize
     * @param id
     * @return
     */
    PageInfo<UserDTO> getUsersByDepartmentId(@NotNull @Valid int pageNum,int pageSize,Long id);

    /**
     * 根据职位id查询用户信息
     * @param pageNum
     * @param pageSize
     * @param id
     * @return
     */
    PageInfo<UserDTO> getUsersByPositionId(@NotNull @Valid int pageNum,int pageSize,Long id);

    /**
     * 根据角色id查询用户信息
     * @param pageNum
     * @param pageSize
     * @param id
     * @return
     */
    PageInfo<UserDTO> getUsersByRoleId(@NotNull @Valid int pageNum,int pageSize,Long id);

}

